/******************************************************************************* * Copyright (c) 2015 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public * License v3.0 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.mapping; import java.io.Serializable; import java.util.List; import com.google.common.collect.Lists; import cuchaz.enigma.Util; public class Signature implements Serializable { private static final long serialVersionUID = -5843719505729497539L; private List<Type> m_argumentTypes; private Type m_returnType; public Signature(String signature) { try { m_argumentTypes = Lists.newArrayList(); int i = 0; while(i < signature.length()) { char c = signature.charAt(i); if(c == '(') { assert m_argumentTypes.isEmpty(); assert m_returnType == null; i++; }else if(c == ')') { i++; break; }else { String type = Type.parseFirst(signature.substring(i)); m_argumentTypes.add(new Type(type)); i += type.length(); } } m_returnType = new Type(Type.parseFirst(signature.substring(i))); }catch(Exception ex) { throw new IllegalArgumentException("Unable to parse signature: " + signature, ex); } } public Signature(Signature other) { m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); m_returnType = new Type(other.m_returnType); } public Signature(Signature other, ClassNameReplacer replacer) { m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); for(int i = 0; i < m_argumentTypes.size(); i++) m_argumentTypes.set(i, new Type(m_argumentTypes.get(i), replacer)); m_returnType = new Type(other.m_returnType, replacer); } public List<Type> getArgumentTypes() { return m_argumentTypes; } public Type getReturnType() { return m_returnType; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("("); for(Type type : m_argumentTypes) buf.append(type.toString()); buf.append(")"); buf.append(m_returnType.toString()); return buf.toString(); } public Iterable<Type> types() { List<Type> types = Lists.newArrayList(); types.addAll(m_argumentTypes); types.add(m_returnType); return types; } @Override public boolean equals(Object other) { if(other instanceof Signature) return equals((Signature)other); return false; } public boolean equals(Signature other) { return m_argumentTypes.equals(other.m_argumentTypes) && m_returnType.equals(other.m_returnType); } @Override public int hashCode() { return Util.combineHashesOrdered(m_argumentTypes.hashCode(), m_returnType.hashCode()); } public boolean hasClass(ClassEntry classEntry) { for(Type type : types()) if(type.hasClass() && type.getClassEntry().equals(classEntry)) return true; return false; } }